package com.ahdy.service;

import com.ahdy.entity.MedicationRecord;
import com.ahdy.entity.MedicationStatisticsDTO;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 用药记录服务接口
 */
@Service
public interface MedicationRecordService {

    /**
     * 添加用药记录
     *
     * @param record 用药记录实体
     * @return 新增记录ID
     */
    Integer addMedicationRecord(MedicationRecord record);

    /**
     * 更新用药记录
     *
     * @param record 用药记录实体
     * @return 影响行数
     */
    int updateMedicationRecord(MedicationRecord record);

    /**
     * 删除用药记录
     *
     * @param id 记录ID
     * @return 影响行数
     */
    int deleteMedicationRecord(Integer id);

    /**
     * 根据ID查询用药记录
     *
     * @param id 记录ID
     * @return 用药记录实体
     */
    MedicationRecord getMedicationRecordById(Integer id);

    /**
     * 根据任务ID查询用药记录
     *
     * @param taskId 任务ID
     * @return 用药记录实体
     */
    MedicationRecord getMedicationRecordByTaskId(Integer taskId);

    /**
     * 根据用户ID查询用药记录列表
     *
     * @param userId 用户ID
     * @return 用药记录列表
     */
    List<MedicationRecord> getMedicationRecordsByUserId(Integer userId);

    /**
     * 根据用户ID和日期范围查询用药记录列表
     *
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 用药记录列表
     */
    List<MedicationRecord> getMedicationRecordsByUserIdAndDateRange(Integer userId, LocalDate startDate,
            LocalDate endDate);

    /**
     * 根据用户ID删除所有用药记录
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    int deleteMedicationRecordsByUserId(Integer userId);

    /**
     * 根据任务ID删除用药记录
     *
     * @param taskId 任务ID
     * @return 影响行数
     */
    int deleteMedicationRecordsByTaskId(Integer taskId);

    /**
     * 获取用药依从性统计
     *
     * @param userId    用户ID
     * @param startDate 开始日期
     * @param endDate   结束日期
     * @return 用药依从性统计列表
     */
    List<MedicationStatisticsDTO> getMedicationComplianceStatistics(Integer userId, LocalDate startDate,
            LocalDate endDate);

    /**
     * 获取延迟服药统计
     *
     * @param userId 用户ID
     * @param days   天数
     * @return 延迟服药统计列表
     */
    List<Map<String, Object>> getDelayStatistics(Integer userId, Integer days);

    /**
     * 获取用药记录详情（包含药物信息）
     *
     * @param userId 用户ID
     * @param limit  限制条数
     * @return 用药记录详情列表
     */
    List<Map<String, Object>> getMedicationRecordDetailsWithMedication(Integer userId, Integer limit);
}
